package com.kaifamiao.handler;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * 自己定义一个类型转换器
 * 从数据库中拿到的值是 1 就转换为 “男"
 * 从数据库中达到的值是 0 就转换为 "女"
 */
@MappedJdbcTypes(JdbcType.BIT)
@MappedTypes(String.class)
public class GenderHandler extends BaseTypeHandler<String> {

    /**
     * 设置值时，调用此方法进行转换
     * @param ps  PreparedStatement 对象
     * @param i    参数的顺序，第几个参数
     * @param parameter  参数
     * @param jdbcType  数据库类型
     * @throws SQLException
     */
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
        if ("男".equals(parameter)) {
            ps.setInt(i, 1);
        } else {
            ps.setInt(i, 0);
        }
    }

    /**
     * 获取到值后进行对象关系映射时调用
     * @param rs  结果集
     * @param columnName  列名
     * @return
     * @throws SQLException
     */
    @Override
    public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return getGender(rs.getInt(columnName));
    }


    /**
     * 获取到值后进行对象关系映射时调用
     * @param rs
     * @param columnIndex
     * @return
     * @throws SQLException
     */
    @Override
    public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return getGender(rs.getInt(columnIndex));
    }

    /**
     * 用于执行存储过程等数据库操作后设置值时调用
     * @param cs
     * @param columnIndex
     * @return
     * @throws SQLException
     */
    @Override
    public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return getGender(cs.getInt(columnIndex));
    }

    /**
     * 是 1 返回男
     * 是 0 返回女
     * @param gender
     * @return
     */
    private String getGender(int gender) {
        if (gender == 1) {
            return "男";
        } else {
            return "女";
        }
    }
}
